package com.dingding.util;

import java.text.DecimalFormat;
import java.util.List;

import com.dingding.bean.entity.Stageprice;
import com.dingding.common.core.config.ServiceCode;
import com.dingding.common.core.util.ToolUtil;

/**
 * @ClassName: OrderPriceUtil
 * @Description: 计价工具
 * @author lijinchao
 * @date 2015-11-23 下午05:19:48
 * @version
 */
public class OrderPriceUtil {

	/**
	 * @Title: getOrderPriceByDistance
	 * @Description: 计算搭车费用
	 * @param distance
	 *            实际距离
	 * @param stageprices
	 *            计价规则表数据集合
	 * @author lijinchao
	 * @return double
	 * @throws
	 */
	public static double getOrderPriceByDistance(Double distance,
			List<Stageprice> stageprices) {

		// 获取计费规则分为几个阶段
		int totalStage = stageprices.size();

		// 创建计价规则对象
		Stageprice stageprice = null;

		// 计算价格
		// 先拿出第一阶段的钱数
		stageprice = stageprices.get(totalStage - 1);
		// 获取当前阶段
		int stage = stageprice.getStage();
		// 当前订单需要支付的价格（不包含红包）
		double price = 0;
		// 当前为第一阶段
		if (stage == 1) {

			price = stageprice.getPrice();
			// 获取第一阶段的终点距离值
			double endRange = stageprice.getEndRange();
			// 如果实际距离大于第一阶段的范围值
			if (endRange != 0 && distance > endRange) {
				// 判断当前订单的距离在第几定价阶段
				for (int i = 0; i < totalStage; i++) {
					stageprice = stageprices.get(i);
					if (distance > stageprice.getStartRange()) {
						// 如果当前不是第一阶段，则加上多余阶段的钱数
						if (totalStage - i - 1 > 0) {
							// 计算时，从第二阶段开始计算，第一阶段的钱已经单独计算出来
							// i 表示所属阶段 0-2代表3-1阶段
							// 从第二阶段开始要算到第i阶段
							for (int j = totalStage - 2; j >= i; j--) {
								stageprice = stageprices.get(j);

								if (j != i) {
									// 未算到所属阶段时
									price += (stageprice.getEndRange() - stageprice
											.getStartRange())
											* stageprice.getPrice();
								} else {
									// 算到所属阶段
									price += (distance - stageprice
											.getStartRange())
											* stageprice.getPrice();
								}
							}
						}
						break;
					}
				}
			}
		}

		// 保留两位小数
		DecimalFormat df = new DecimalFormat("#.0");
		price = ToolUtil.castDouble(df.format(price));

		// 价格=距离所需费用+每人所交的保险费用
		return price + ServiceCode.INSURANCE;
	}
}
